#include "stdafx.h"
#include ".\wezel.h"

int j=0;

wezel::wezel()
{
	przodek=NULL;
	nastepny=NULL;
	poprzedni=NULL;
	pot_pierwszy=NULL;
	pot_ostatni=NULL;
	wysokosc=0;
	ilosc_potomkow=0;
	strzalka=NULL;
	etykieta=NULL;
	X=j;
	j++;
}

wezel::wezel(string *s)
{
	przodek=NULL;
	nastepny=NULL;
	poprzedni=NULL;
	pot_pierwszy=NULL;
	pot_ostatni=NULL;
	wysokosc=0;
	ilosc_potomkow=0;
	strzalka=NULL;
	etykieta=s;
	X=j;
	j++;
}
wezel::~wezel(void)
{
}

wezel *wezel::pobierz_przodek()
{
	return przodek;
}

void wezel::zmien_przodek(wezel *w)
{
	przodek=w;
}

wezel *wezel::pobierz_nastepny()
{
	return nastepny;
}

void wezel::zmien_nastepny(wezel *w)
{
	nastepny=w;
}

wezel *wezel::pobierz_poprzedni()
{
	return poprzedni;
}

void wezel::zmien_poprzedni(wezel *w)
{
	poprzedni=w;
}

wezel *wezel::pobierz_pot_pierwszy()
{
	return pot_pierwszy;
}

void wezel::zmien_pot_pierwszy(wezel *w)
{
	pot_pierwszy=w;
}

wezel *wezel::pobierz_pot_ostatni()
{
	return pot_ostatni;
}
void wezel::zmien_pot_ostatni(wezel *w)
{
	pot_ostatni=w;
}

int wezel::pobierz_wysokosc()
{
	return wysokosc;
}
void wezel::zmien_wysokosc(int h)
{
	wysokosc=h;
}
int wezel::pobierz_ilosc_potomkow()
{
	return ilosc_potomkow;
}
void wezel::zmien_ilosc_potomkow(int n)
{
	ilosc_potomkow=n;
}

void wezel::aktualizacja_wys()
{
	if(przodek!=NULL)
		wysokosc=przodek->wysokosc+1;
	wezel *pom;
	pom=pot_pierwszy;
	while(pom!=NULL)
	{
		pom->wysokosc=wysokosc+1;
		pom->aktualizacja_wys();
		pom=pom->nastepny;
	}
}
void wezel::dodaj_syna(wezel *w,wezel *brat,string *s)
{
	polaczenie *pol;
	if(w==NULL)
	{
		if (s==NULL) w=new wezel();
		else w=new wezel(s);
	}
	w->przodek=this;

	if(brat==NULL)
	{
		if(ilosc_potomkow>0)
		{
			pot_ostatni->nastepny=w;
			w->poprzedni=pot_ostatni;
		}
		else
			pot_pierwszy=w;
		pot_ostatni=w;
	}
	else 
	{
		if(brat->poprzedni!=NULL)
		{
			brat->poprzedni->nastepny=w;
			w->poprzedni=brat->poprzedni;
		}
		else
			pot_pierwszy=w;
		w->nastepny=brat;
		brat->poprzedni=w;	
	}
	ilosc_potomkow++;
	w->wysokosc=wysokosc+1;
	aktualizacja_wys(); 
	
	pol=new polaczenie();
	pol->ustaw_poczatek(this);
	pol->ustaw_koniec(w);
	w->strzalka=pol;
}

void wezel::dodaj_brata(wezel *w)
{
	if(przodek!=NULL)
		przodek->dodaj_syna(w,this);
}

wezel *wezel::usun(wezel *syn)
{
	wezel *pom;
	if(syn==NULL)
	{
		if(przodek!=NULL)
		{
			if(poprzedni!=NULL)
				poprzedni->nastepny=nastepny;
			else
				przodek->pot_pierwszy=nastepny;
			if(nastepny!=NULL)
				nastepny->poprzedni=poprzedni;
			else
				przodek->pot_ostatni=poprzedni;
			przodek->ilosc_potomkow--;
		}
		pom=this;
	}
	else
	{
		pom=syn->usun();
	}
	pom->nastepny=NULL;
	pom->poprzedni=NULL;
	pom->przodek=NULL;
	pom->wysokosc=0;
	pom->aktualizacja_wys();
	pom->strzalka=NULL;

	return pom;
}

void wezel::wypisz()
{
	wezel *pom;
	//for(int i=1;i<=wysokosc;i++)
	//{
		//cout<<"   ";
	//}
	//string *str=etykieta;
	//cout<<(*etykieta)<<"\n";
	pom=pot_pierwszy;
	while(pom!=NULL)
	{
		pom->wypisz();
		pom=pom->nastepny;
	}
}
bool wezel::przenies_w_gore(wezel *w)
{
	if((w!=NULL)&&(w->pobierz_przodek()!=NULL)&&(w->pobierz_przodek()->pobierz_przodek()!=NULL))
	{
		wezel *pom=w->pobierz_przodek();
		wezel *wsk=w->usun();
		pom->dodaj_brata(wsk);
		return true;
	}
	else return false;
}

bool wezel::przenies_w_dol(wezel *w)
{
	if((w!=NULL)&&((w->pobierz_nastepny()!=NULL)||(w->pobierz_poprzedni()!=NULL)))
	{
		if(w->pobierz_nastepny()!=NULL)
		{
			wezel *pom=w->pobierz_nastepny();
			wezel *wsk=w->usun();
			pom->dodaj_syna(wsk,pom->pobierz_pot_pierwszy());
		}
		else
		{
			wezel *pom=w->pobierz_poprzedni();
			wezel *wsk=w->usun();
			pom->dodaj_syna(wsk);
		}
		return true;
	}
	else return false;
}

bool wezel::przenies_w_prawo(wezel *w)
{
	if((w!=NULL)&&(w->pobierz_przodek()!=NULL))
	{
		wezel *pom=w->pobierz_nastepny();
		if(pom!=NULL)
		{
			pom=pom->pobierz_nastepny();
			pom->dodaj_brata(w->usun());
			return true;
		}
		else
		{
			pom=w->pobierz_przodek();
			if(pom->pobierz_przodek()!=NULL)
			{
				pom->pobierz_przodek()->dodaj_syna(w->usun(),pom->pobierz_nastepny());
				return true;
			}
			else return false;
		}
	}
	else return false;
}

bool wezel::przenies_w_lewo(wezel *w)
{
	if((w!=NULL)&&(w->pobierz_przodek()!=NULL))
	{
		wezel *pom=w->pobierz_poprzedni();
		if(pom!=NULL)
		{
			pom->dodaj_brata(w->usun());
			return true;
		}
		else
		{
			pom=w->pobierz_przodek();
			if(pom->pobierz_przodek()!=NULL)
			{
				pom->dodaj_brata(w->usun());
				return true;
			}
			else return false;
		}
	}
	else return false;
}